﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;
using EncryptionClassLibrary.Encryption;

namespace JA.Negocios
{
    public static partial class ModelBO
    {

        public static UsuarioVO getUsuario(string user)
        {
            UsuarioVO usuarioVO = null;
            List<UsuarioVO> usuarios = getUsuarios(user);
            if (usuarios != null && usuarios.Count > 0)
            {
                usuarioVO = usuarios[0];
            }
            return usuarioVO;
           
        }

        public static UsuarioVO getUsuario(int? IdUser)
        {
            UsuarioVO usuarioVO = null;
            List<UsuarioVO> usuarios = getUsuarios(IdUser);
            if (usuarios != null && usuarios.Count > 0)
            {
                usuarioVO = usuarios[0];
            }
            return usuarioVO;

        }

        public static List<UsuarioVO> getUsuarios()
        {
            return getUsuarios(null, null,  false);
        }

        public static List<UsuarioVO> getUsuarios(string user)
        {
            return getUsuarios(user, null,  false);
        }

        public static List<UsuarioVO> getUsuarios(int? IdUser)
        {
            return getUsuarios(null, IdUser, false);
        }

        public static List<UsuarioVO> getUsuarios(string user, int? idUser, bool ativo)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdUsuario, Usuario, Nome, Senha, Ativo, Cadastro, CadastradoPor, Edicao, EditadoPor, CadUsu, CadPar, CadEst, CadCid, CadBai, CadCli, CadCar, CadCom, CadTip, CadCat, CadImo, CadFot, CadLnk, CadCtt ");

            query.AppendLine("FROM usuario ");
            if (user != null)
            {
                query.AppendLine(where + "Usuario=?Usuario ");
                where = "and ";
            }
            if (idUser != null)
            {
                query.AppendLine(where + "IdUsuario=?IdUsuario ");
                where = "and ";
            }
            if (ativo)
            {
                query.AppendLine(where + "Ativo=?Ativo ");
                where = "and ";
            }
            query.AppendLine("ORDER BY usuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (user != null) cmd.Parameters.AddWithValue("?Usuario", user);
            if (idUser != null) cmd.Parameters.AddWithValue("?IdUsuario", idUser);
            if (ativo) cmd.Parameters.AddWithValue("?Ativo", (ativo?'S':'N'));

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<UsuarioVO> listUsuario = new List<UsuarioVO>();

                while (reader.Read())
                {
                    UsuarioVO usuarioVO = UsuarioVO.CreateUsuarioVO();
                    usuarioVO.idUsuario = reader.GetInt32(reader.GetOrdinal("IdUsuario"));
                    usuarioVO.usuario = reader.GetString(reader.GetOrdinal("Usuario"));
                    usuarioVO.nome = reader.GetString(reader.GetOrdinal("Nome"));
                    usuarioVO.senha = reader.GetString(reader.GetOrdinal("Senha"));
                    usuarioVO.ativo = reader.GetString(reader.GetOrdinal("Ativo")).Equals("S");
                    usuarioVO.cadastro = reader.GetDateTime(reader.GetOrdinal("Cadastro"));
                    usuarioVO.cadastradoPor = reader.GetString(reader.GetOrdinal("CadastradoPor"));
                    usuarioVO.edicao = reader.GetDateTime(reader.GetOrdinal("Edicao"));
                    usuarioVO.editadoPor = reader.GetString(reader.GetOrdinal("EditadoPor"));
                    usuarioVO.cadUsu = reader.GetString(reader.GetOrdinal("CadUsu")).Equals("S");
                    usuarioVO.cadPar = reader.GetString(reader.GetOrdinal("CadPar")).Equals("S");
                    usuarioVO.cadEst = reader.GetString(reader.GetOrdinal("CadEst")).Equals("S");
                    usuarioVO.cadCid = reader.GetString(reader.GetOrdinal("CadCid")).Equals("S");
                    usuarioVO.cadBai = reader.GetString(reader.GetOrdinal("CadBai")).Equals("S");
                    usuarioVO.cadCli = reader.GetString(reader.GetOrdinal("CadCli")).Equals("S");
                    usuarioVO.cadCar = reader.GetString(reader.GetOrdinal("CadCar")).Equals("S");
                    usuarioVO.cadCom = reader.GetString(reader.GetOrdinal("CadCom")).Equals("S");
                    usuarioVO.cadTip = reader.GetString(reader.GetOrdinal("CadTip")).Equals("S");
                    usuarioVO.cadCat = reader.GetString(reader.GetOrdinal("CadCat")).Equals("S");
                    usuarioVO.cadImo = reader.GetString(reader.GetOrdinal("CadImo")).Equals("S");
                    usuarioVO.cadFot = reader.GetString(reader.GetOrdinal("CadFot")).Equals("S");
                    usuarioVO.cadLnk = reader.GetString(reader.GetOrdinal("CadLnk")).Equals("S");
                    usuarioVO.cadCtt = reader.GetString(reader.GetOrdinal("CadCtt")).Equals("S");

                    usuarioVO.senha = DecryptPassword(usuarioVO.senha);

                    listUsuario.Add(usuarioVO);
                }
                reader.Close();
                return listUsuario;
            }
            catch (Exception ex){ throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static void setUsuario(UsuarioVO usuarioVO)
        {
            usuarioVO.senha = EncryptPassword(usuarioVO.senha);
            
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE usuario ");
            query.AppendLine("SET Usuario=?Usuario, Nome=?Nome, Senha=?Senha, Ativo=?Ativo,Cadastro=?Cadastro, CadastradoPor=?CadastradoPor, Edicao=?Edicao, EditadoPor=?EditadoPor, CadUsu=?CadUsu, CadPar=?CadPar, CadEst=?CadEst, CadCid=?CadCid, CadBai=?CadBai, CadCli=?CadCli, CadCar=?CadCar, CadCom=?CadCom, CadTip=?CadTip, CadCat=?CadCat, CadImo=?CadImo, CadFot=?CadFot, CadLnk=?CadLnk, CadCtt=?CadCtt ");

            query.AppendLine("WHERE IdUsuario=?IdUsuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdUsuario", usuarioVO.idUsuario);
            cmd.Parameters.AddWithValue("?Usuario", usuarioVO.usuario);
            cmd.Parameters.AddWithValue("?Nome", usuarioVO.nome);
            cmd.Parameters.AddWithValue("?Senha", usuarioVO.senha);
            cmd.Parameters.AddWithValue("?Ativo", (usuarioVO.ativo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Cadastro", usuarioVO.cadastro);
            cmd.Parameters.AddWithValue("?CadastradoPor", usuarioVO.cadastradoPor);
            cmd.Parameters.AddWithValue("?Edicao", usuarioVO.edicao);
            cmd.Parameters.AddWithValue("?EditadoPor", usuarioVO.editadoPor);
            cmd.Parameters.AddWithValue("?CadUsu", (usuarioVO.cadUsu ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadPar", (usuarioVO.cadPar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadEst", (usuarioVO.cadEst ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCid", (usuarioVO.cadCid ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadBai", (usuarioVO.cadBai ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCli", (usuarioVO.cadCli ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCar", (usuarioVO.cadCar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCom", (usuarioVO.cadCom ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadTip", (usuarioVO.cadTip ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCat", (usuarioVO.cadCat ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadImo", (usuarioVO.cadImo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadFot", (usuarioVO.cadFot ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadLnk", (usuarioVO.cadLnk ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCtt", (usuarioVO.cadCtt ? 'S' : 'N'));

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static long newUsuario(UsuarioVO usuarioVO)
        {
            usuarioVO.senha = EncryptPassword(usuarioVO.senha);

            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO usuario ");
            query.AppendLine(" ( Usuario, Nome, Senha, Ativo, Cadastro, CadastradoPor, Edicao, EditadoPor, CadUsu, CadPar, CadEst, CadCid, CadBai, CadCli, CadCar, CadCom, CadTip, CadCat, CadImo, CadFot, CadLnk, CadCtt ) ");
            query.AppendLine("VALUES ( ?Usuario, ?Nome, ?Senha, ?Ativo, ?Cadastro, ?CadastradoPor, ?Edicao, ?EditadoPor , ?CadUsu, ?CadPar, ?CadEst, ?CadCid, ?CadBai, ?CadCli, ?CadCar, ?CadCom, ?CadTip, ?CadCat, ?CadImo, ?CadFot, ?CadLnk, ?CadCtt ) ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?Usuario", usuarioVO.usuario);
            cmd.Parameters.AddWithValue("?Nome", usuarioVO.nome);
            cmd.Parameters.AddWithValue("?Senha", usuarioVO.senha);
            cmd.Parameters.AddWithValue("?Ativo", (usuarioVO.ativo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Cadastro", usuarioVO.cadastro);
            cmd.Parameters.AddWithValue("?CadastradoPor", usuarioVO.cadastradoPor);
            cmd.Parameters.AddWithValue("?Edicao", usuarioVO.edicao);
            cmd.Parameters.AddWithValue("?EditadoPor", usuarioVO.editadoPor);
            cmd.Parameters.AddWithValue("?CadUsu", (usuarioVO.cadUsu ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadPar", (usuarioVO.cadPar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadEst", (usuarioVO.cadEst ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCid", (usuarioVO.cadCid ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadBai", (usuarioVO.cadBai ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCli", (usuarioVO.cadCli ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCar", (usuarioVO.cadCar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCom", (usuarioVO.cadCom ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadTip", (usuarioVO.cadTip ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCat", (usuarioVO.cadCat ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadImo", (usuarioVO.cadImo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadFot", (usuarioVO.cadFot ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadLnk", (usuarioVO.cadLnk ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?CadCtt", (usuarioVO.cadCtt ? 'S' : 'N'));

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();

                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delUsuario(UsuarioVO usuarioVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM usuario ");
            query.AppendLine("WHERE IdUsuario=?IdUsuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdUsuario", usuarioVO.idUsuario);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }


        public static string EncryptPassword(string password)
        {
            try
            {
                Symmetric sym = new Symmetric(Symmetric.Provider.Rijndael, true);
                Data key = new Data("GoiabadaCica");
                Data encryptedData = new Data();

                encryptedData = sym.Encrypt(new Data(password), key);
                string base64EncryptedString = encryptedData.ToBase64();
                return base64EncryptedString;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static string DecryptPassword(string password)
        {

            try
            {
                Symmetric sym = new Symmetric(Symmetric.Provider.Rijndael, true);
                Data key = new Data("GoiabadaCica");
                Data encryptedData = new Data();
                encryptedData.Base64 = password;
                Data decryptedData = new Data();
                decryptedData = sym.Decrypt(encryptedData, key);
                return decryptedData.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
    }
}
